package modele;

import controleur.*;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Observable;

public class BaseDeDonnees extends Observable {
	List<TrainArrivee> listTrainArr = null;
	List<TrainDepart> listTrainDep = null;
	private String infoGeneral = null;
	
	public BaseDeDonnees()
	{
		listTrainArr = new ArrayList<TrainArrivee>();
		listTrainDep = new ArrayList<TrainDepart>();
		infoGeneral =
				"Pour assurer le départ à l'heure des trains, nous invitons les voyageurs" +
				"a monter imperativement à bord au plus tard 2...";
	}
	
	public void initialiserDonnees()
	{
		// Arriv
		String typeTrain = "TGV";
		TrainArrivee trainBase;
		for(int i = 0; i < 8; i++)
		{
			typeTrain = "TGV".equals(typeTrain) ? "TER" : "TGV";
			trainBase = new TrainArrivee();
			trainBase.setType(typeTrain);
			trainBase.setNumero(i);
			trainBase.setHeure("10:" + Integer.toString(i + 15));
			trainBase.setProvenance("Paris");
			trainBase.setInfo("");
			trainBase.setNumeroVoie(i + 5);
			listTrainArr.add(trainBase);
		}
		this.updateVues_arr();
		
		// Dep
		TrainDepart trainBase2;
		for(int i = 0; i < 8; i++)
		{
			typeTrain = "TGV".equals(typeTrain) ? "TER" : "TGV";
			trainBase2 = new TrainDepart();
			trainBase2.setType(typeTrain);
			trainBase2.setNumero(i);
			trainBase2.setHeure("10:" + Integer.toString(i + 15));
			trainBase2.setDestination("Paris");
			trainBase2.setInfo("");
			trainBase2.setNumeroVoie(i + 5);
			listTrainDep.add(trainBase2);
		}
		this.updateVues_dep();
		
		this.updateVues_info();
	}
	
	/*Trains Arr*/
	public void ModifierTrainArr(TrainArrivee trainB)
	{
		Iterator<TrainArrivee> it = listTrainArr.iterator();
		// Pour chercher le profil à supprimer
		while(it.hasNext())
		{
			TrainArrivee _ElementCourant = (TrainArrivee)it.next();
			if(_ElementCourant.getNumero() == trainB.getNumero())	{
				it.remove();// S'il l'élément a l'index, il est supprimé
				break;
			}
		}
		listTrainArr.add(trainB);
		this.updateVues_arr();
	}
	
	/*Trains Arr*/
	public void SupprimerTrainArr(TrainArrivee trainB)
	{
		Iterator<TrainArrivee> it = listTrainArr.iterator();
		// Pour chercher le profil à supprimer
		while(it.hasNext())
		{
			TrainArrivee _ElementCourant = (TrainArrivee)it.next();
			if(_ElementCourant.getNumero() == trainB.getNumero())	{
				it.remove();// S'il l'élément a l'index, il est supprimé
				break;
			}
		}
		this.updateVues_arr();
	}
	
	/*Trains Arr*/
	public void ModifierTrainDep(TrainDepart trainB)
	{
		Iterator<TrainDepart> it = listTrainDep.iterator();
		// Pour chercher le profil à supprimer
		while(it.hasNext())
		{
			TrainDepart _ElementCourant = (TrainDepart)it.next();
			if(_ElementCourant.getNumero() == trainB.getNumero())	{
				it.remove();// S'il l'élément a l'index, il est supprimé
				break;
			}
		}
		listTrainDep.add(trainB);
		this.updateVues_dep();
	}
	
	/*Trains Dep*/
	public void SupprimerTrainDep(TrainArrivee trainB)
	{
		Iterator<TrainDepart> it = listTrainDep.iterator();
		// Pour chercher le profil à supprimer
		while(it.hasNext())
		{
			TrainDepart _ElementCourant = (TrainDepart)it.next();
			if(_ElementCourant.getNumero() == trainB.getNumero())	{
				it.remove();// S'il l'élément a l'index, il est supprimé
				break;
			}
		}
		this.updateVues_dep();
	}
	
	public void ModifInfoGen(String nwInfo)
	{
		this.infoGeneral = nwInfo;
	}
	
	
	public void updateVues_arr()
	{
		setChanged();
		MainControleur.defTypeChange("arr");
		notifyObservers(listTrainArr);
	}
	
	public void updateVues_dep()
	{
		setChanged();
		MainControleur.defTypeChange("dep");
		notifyObservers(listTrainDep);
	}
	
	public void updateVues_info()
	{
		setChanged();
		MainControleur.defTypeChange("info");
		notifyObservers(this.infoGeneral);
	}
}
